import Koa from 'koa';
import views from 'koa-views';
import json from 'koa-json';
import onerror from 'koa-onerror';
import bodyparser from 'koa-bodyparser';
import koaStatic from 'koa-static';
import logger from 'koa-logger';
import cors from '@koa/cors';
// 路由
import index from './routes/index';
// 中间件
import jwtToken from './middleware/jwt-token';
import auth from './middleware/auth';
import utils from './middleware/utils';

// 定时脚本
import schedule from './bin/shedule';
// 自定义方法
import { reportError } from './utils';
// 自定义配置
import { INIT_DATABASE } from './config';
import { sequelize } from './models';
import { initRedis, initDatabase } from './bin/init';

const app = new Koa();

// 是否清理数据库
sequelize.sync({ force: INIT_DATABASE || !!process.env.TEST_DATABASE }).then(async () => {
  initRedis();
  // in test mode, start application after clean at every times
  if (INIT_DATABASE || !!process.env.TEST_DATABASE) {
    initDatabase();
  }
});

// 定时任务开始执行
schedule();

// 任务执行
// updateBookSecret();

// 错误处理
onerror(app);

// 加大上传大小限制
app.use(
  bodyparser({
    formLimit: '10mb',
    jsonLimit: '10mb',
    textLimit: '10mb'
  })
);

// 存放静态资源
app.use(koaStatic(__dirname + '/public'));

app.use(json());
app.use(logger());
app.use(
  views(__dirname + '/views', {
    extension: 'pug'
  })
);

// 跨域
app.use(cors());

// 中间件
app.use(utils);
app.use(jwtToken);
app.use(auth);

// 路由
app.use(index.routes());

// 错误处理
app.on('error', (err, ctx) => {
  console.log('server error', err);
  reportError('服务器500错误--' + err.toString(), err, {
    priority: '紧急',
    category: '服务器500',
    extra: { url: `${ctx.method} ${ctx.url}`, query: JSON.stringify(ctx.request.query), body: JSON.stringify(ctx.request.body) }
  });
});

export default app;
